package me.yushuai.wukong.base.api;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import me.yushuai.wukong.base.api.dto.*;
import me.yushuai.wukong.base.api.vo.ZoneGroupVO;
import me.yushuai.wukong.base.api.vo.ZoneVO;
import me.yushuai.wukong.common.dto.PageDTO;
import me.yushuai.wukong.common.error.WuKongWebException;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

/**
 * 库区管理客户端
 *
 * @author zhoushuai@189.cn
 * @since 2022-08-25
 */
@Api("库区API")
@FeignClient("${spring.application.name}")
public interface WarehouseZoneApi {

    /**
     * 新建一条库区记录
     *
     * @param dto 新建库区信息
     * @return 返回库区的编号
     * @throws WuKongWebException 当库区编码已经存在时抛出异常
     */
    @ApiOperation("新建库区")
    @PostMapping("/zone")
    Long createZone(@Validated @RequestBody CreateZoneDTO dto) throws WuKongWebException;

    /**
     * 修改库区信息
     *
     * @param zoneId        库区编号
     * @param dto 库区信息
     * @return 返回被修改的库区编号
     * @throws WuKongWebException 当库区编号不存在时抛出异常
     */
    @ApiOperation("修改库区")
    @PutMapping("/zone/{zoneId}")
    Long editZone(@PathVariable("zoneId") Long zoneId, @Validated @RequestBody UpdateZoneDTO dto)
            throws WuKongWebException;

    /**
     * 删除一条库区信息
     *
     * @param zoneId 库区编号
     * @return 返回库区的编号
     * @throws WuKongWebException 当库区不存在时抛出异常
     */
    @ApiOperation("删除库区")
    @DeleteMapping("/zone/{zoneId}")
    Long deleteZone(@PathVariable("zoneId") Long zoneId) throws WuKongWebException;

    /**
     * 获取库区详细信息
     *
     * @param zoneId 库区编号
     * @return 返回库区详细信息
     * @throws WuKongWebException 当库区信息不存在时抛出异常
     */
    @ApiOperation("库区详细信息")
    @GetMapping("/zone/{zoneId}")
    ZoneVO getZoneById(@PathVariable("zoneId") Long zoneId) throws WuKongWebException;


    /**
     * 分页条件检索库区信息
     *
     * @param dto 分页检索条件
     * @return 分页返回检索结果
     */
    @ApiOperation("分页条件检索海关编码信息")
    @PostMapping("/zone-list")
    PageDTO<ZoneVO> pagingSearchZone(@Validated @RequestBody PagingSearchZone dto);


    /**
     * 新建一条区域记录
     *
     * @param dto 新建区域信息
     * @return 返回区域的编号
     * @throws WuKongWebException 当区域编码已经存在时抛出异常
     */
    @ApiOperation("新建区域")
    @PostMapping("/zone-group")
    Long createZoneGroup(@Validated @RequestBody CreateZoneGroupDTO dto) throws WuKongWebException;

    /**
     * 修改区域信息
     *
     * @param zoneGroupId        区域编号
     * @param updateZoneGroupDTO 区域信息
     * @return 返回被修改的区域编号
     * @throws WuKongWebException 当区域编号不存在时抛出异常
     */
    @ApiOperation("修改区域")
    @PutMapping("/zone-group/{zoneGroupId}")
    Long editZoneGroup(@PathVariable("zoneGroupId") Long zoneGroupId, @Validated @RequestBody UpdateZoneGroupDTO updateZoneGroupDTO)
            throws WuKongWebException;

    /**
     * 删除一条区域信息
     *
     * @param id 区域编号
     * @return 返回区域的编号
     * @throws WuKongWebException 当区域不存在时抛出异常
     */
    @ApiOperation("删除区域")
    @DeleteMapping("/zone-group/{id}")
    Long deleteZoneGroup(@PathVariable("id") Long id) throws WuKongWebException;

    /**
     * 获取区域详细信息
     *
     * @param id 区域编号
     * @return 返回区域详细信息
     * @throws WuKongWebException 当区域信息不存在时抛出异常
     */
    @ApiOperation("区域详细信息")
    @GetMapping("/zone-group/{id}")
    ZoneGroupVO getZoneGroupById(@PathVariable("id") Long id) throws WuKongWebException;


    /**
     * 分页条件检索区域信息
     *
     * @param dto 分页检索条件
     * @return 分页返回检索结果
     */
    @ApiOperation("分页条件检索海关编码信息")
    @PostMapping("/zone-group-list")
    PageDTO<ZoneGroupVO> pagingSearchZoneGroup(@Validated @RequestBody PagingSearchZoneGroup dto);
}
